home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / edit / pt30.lha / SOURCE / PTPlay30B.S
Text File  |  1992-05-12  |  26KB  |  1,253 lines

  1. *****************************************************************
  2. *               »» Protracker 3.00B playroutine ««              *
  3. * Written by Tom "Outland" Bech and Ivar "Heatseeker" J. Olsen. *
  4. * Based upon Protracker 1.1A playroutine written by Lars Hamre. *
  5. *          VBlank version. Not optimised in any way.            *
  6. *****************************************************************
  7. * Call pt_InitMusic before start. Then call pt_PlayMusic at VB. *
  8. * To stop the music, call pt_StopMusic.                         *
  9. * Please note that in this version, all SetTempo commands are   *
  10. * ignored. This assembly language program has been tested with  *
  11. * the Devpac 3.0, AsmOne 1.2, MCAsm 1.5 and a68k assemblers and *
  12. * may have to be modified for other assemblers.            *
  13. *****************************************************************
  14.  
  15. ; FileFormat offsets
  16. sd_songname    EQU    0    ;songname offset
  17. sd_sampleinfo    EQU    20    ;first sample starts here
  18. sd_numofpatt    EQU    950    ;number of patterns are stored here
  19. sd_pattpos    EQU    952    ;pattern positions table is here
  20. sd_mahokakt    EQU    1080    ;"M.K." :)
  21. sd_patterndata    EQU    1084    ;first pattern starts at this position
  22.  
  23. ; Song offsets. W/L/B means word/longword/byte length.
  24. n_note        EQU    0      ;W
  25. n_cmd        EQU    2      ;W
  26. n_cmdlo        EQU    3      ;low B of cmd
  27. n_start        EQU    4      ;L
  28. n_length    EQU    8      ;W
  29. n_loopstart    EQU    10     ;L
  30. n_replen    EQU    14     ;W
  31. n_period    EQU    16     ;W
  32. n_finetune    EQU    18     ;B
  33. n_volume    EQU    19     ;B
  34. n_dmabit    EQU    20     ;W
  35. n_toneportdirec    EQU    22     ;B
  36. n_toneportspeed    EQU    23     ;B
  37. n_wantedperiod    EQU    24     ;W
  38. n_vibratocmd    EQU    26     ;B
  39. n_vibratopos    EQU    27     ;B
  40. n_tremolocmd    EQU    28     ;B
  41. n_tremolopos    EQU    29     ;B
  42. n_wavecontrol    EQU    30     ;B
  43. n_glissfunk    EQU    31     ;B
  44. n_sampleoffset    EQU    32     ;B
  45. n_pattpos    EQU    33     ;B
  46. n_loopcount    EQU    34     ;B
  47. n_funkoffset    EQU    35     ;B
  48. n_wavestart    EQU    36     ;L
  49. n_reallength    EQU    40     ;W
  50. n_trigger    EQU    42     ;B
  51. n_samplenum    EQU    43     ;B
  52.  
  53. pt_InitMusic
  54.     MOVEM.L    D0-D3/A0-A2,-(SP)
  55.     LEA    pt_data,a0
  56.     MOVE.L    A0,pt_SongDataPtr
  57.     LEA    sd_pattpos(A0),A1
  58.     MOVEQ    #128-1,D0
  59.     MOVEQ    #0,D1
  60.     MOVEQ    #0,D2
  61.     moveq    #$1e,d3
  62. pt_lop2 MOVE.B    (A1)+,D1
  63.     CMP.B    D2,D1
  64.     BLE.B    pt_lop
  65.     MOVE.L    D1,D2
  66. pt_lop    DBRA    D0,pt_lop2
  67.     ADDQ.W    #1,d2
  68.     ASL.L    #8,D2
  69.     ASL.L    #2,D2
  70.     LEA    4(A1,D2.L),A2
  71.     LEA    pt_SampleStarts(PC),A1
  72.     ADD.W    #2*20+2,A0        ;find first sample length
  73.     MOVEQ    #31-1,D0
  74. pt_lop3 MOVE.L    A2,(A1)+
  75.     MOVEQ    #0,D1
  76.     MOVE.W    (A0),D1
  77.     ASL.L    #1,D1
  78.     ADD.L    D1,A2
  79.     ADD.L    D3,A0
  80.     DBRA    D0,pt_lop3
  81.     MOVE.B    #6,pt_Speed        ;default speed
  82.     OR.B    #2,$BFE001
  83.     MOVEQ    #0,D0
  84.     LEA    $DFF000,A0
  85.     MOVE.W    D0,$A8(A0)
  86.     MOVE.W    D0,$B8(A0)
  87.     MOVE.W    D0,$C8(A0)
  88.     MOVE.W    D0,$D8(A0)
  89.     CLR.B    pt_SongPos
  90.     CLR.B    pt_Counter
  91.     CLR.B    pt_PattPos
  92.     MOVEM.L    (SP)+,D0-D3/A0-A2
  93.     RTS
  94.  
  95. pt_StopMusic
  96.     MOVEM.L    D0/A0,-(SP)
  97.     MOVEQ    #0,D0
  98.     LEA    $DFF000,A0
  99.     MOVE.W    D0,$A8(A0)
  100.     MOVE.W    D0,$B8(A0)
  101.     MOVE.W    D0,$C8(A0)
  102.     MOVE.W    D0,$D8(A0)
  103.     MOVE.W    #$000F,$DFF096        ;stop AudioDMA activity
  104.     MOVEM.L    (SP)+,D0/A0
  105.     RTS
  106.  
  107. pt_PlayMusic
  108.     MOVEM.L    D0-D7/A0-A6,-(SP)
  109.     MOVE.L    pt_SongDataPtr(PC),A0
  110.     ADDQ.L    #1,pt_Counter
  111.     MOVE.L    pt_Counter(PC),D0
  112.     CMP.L    pt_CurrSpeed(PC),D0
  113.     BLO.B    pt_NoNewNote
  114.     CLR.L    pt_Counter
  115.     TST.B    pt_PattDelayTime2
  116.     BEQ.B    pt_GetNewNote
  117.     BSR.B    pt_NoNewAllChannels
  118.     BRA.W    pt_dskip
  119.  
  120. pt_NoNewNote
  121.     BSR.B    pt_NoNewAllChannels
  122.     BRA.W    pt_NoNewPositionYet
  123.  
  124. pt_NoNewAllChannels
  125.     LEA    pt_audchan1temp(PC),A6
  126.     LEA    $DFF0A0,A5
  127.     BSR.W    pt_CheckEffects
  128.     LEA    pt_audchan2temp(PC),A6
  129.     LEA    $DFF0B0,A5
  130.     BSR.W    pt_CheckEffects
  131.     LEA    pt_audchan3temp(PC),A6
  132.     LEA    $DFF0C0,A5
  133.     BSR.W    pt_CheckEffects
  134.     LEA    pt_audchan4temp(PC),A6
  135.     LEA    $DFF0D0,A5
  136.     BRA.W    pt_CheckEffects
  137.  
  138. pt_GetNewNote
  139.     LEA    12(A0),A3
  140.     LEA    sd_pattpos(A0),A2
  141.     LEA    sd_patterndata(A0),A0
  142.     MOVEQ    #0,D1
  143.     MOVE.L    pt_SongPosition(PC),D0
  144.     MOVE.B    0(a2,D0.W),D1
  145.     ASL.L    #8,D1                ;*1024
  146.     ASL.L    #2,D1
  147.  
  148.     ADD.L    pt_PatternPosition(PC),D1
  149.     MOVE.L    D1,pt_PatternPtr
  150.     CLR.W    pt_DMACONtemp
  151.     LEA    $DFF0A0,A5
  152.     LEA    pt_audchan1temp(PC),A6
  153.     MOVEQ    #1,D2
  154.     BSR.W    pt_PlayVoice
  155.     MOVEQ    #0,D0
  156.     MOVE.B    n_volume(A6),D0
  157.     MOVE.W    D0,8(A5)
  158.     LEA    $DFF0B0,A5
  159.     LEA    pt_audchan2temp(PC),A6
  160.     MOVEQ    #2,D2
  161.     BSR.B    pt_PlayVoice
  162.     MOVEQ    #0,D0
  163.     MOVE.B    n_volume(A6),D0
  164.     MOVE.W    D0,8(A5)
  165.     LEA    $DFF0C0,A5
  166.     LEA    pt_audchan3temp(PC),A6
  167.     MOVEQ    #3,D2
  168.     BSR.B    pt_PlayVoice
  169.     MOVEQ    #0,D0
  170.     MOVE.B    n_volume(A6),D0
  171.     MOVE.W    D0,8(A5)
  172.     LEA    $DFF0D0,A5
  173.     LEA    pt_audchan4temp(PC),A6
  174.     MOVEQ    #4,D2
  175.     BSR.B    pt_PlayVoice
  176.     MOVEQ    #0,D0
  177.     MOVE.B    n_volume(A6),D0
  178.     MOVE.W    D0,8(A5)
  179.     BRA.W    pt_SetDMA
  180.  
  181. pt_CheckMetronome
  182.     CMP.B    pt_MetroChannel,D2
  183.     BNE.W    pt_Return
  184.     MOVE.B    pt_MetroSpeed,D2
  185.     BEQ.W    pt_Return
  186.     MOVE.L    pt_PatternPosition,D3
  187.     LSR.L    #4,D3
  188.     DIVU    D2,D3
  189.     SWAP    D3
  190.     TST.W    D3
  191.     BNE.W    pt_Return
  192.     AND.L    #$00000FFF,(A6)
  193.     OR.L    #$10D6F000,(A6)     ;Play sample $1F at period $0D6 (214)
  194.     RTS
  195.  
  196. pt_PlayVoice
  197.     TST.L    (A6)
  198.     BNE.B    pt_plvskip
  199.     BSR.W    pt_PerNop
  200. pt_plvskip
  201.     MOVE.L    0(a0,D1.L),(A6)        ;Read one track from pattern
  202.     BSR.B    pt_CheckMetronome
  203.     ADDQ.L    #4,D1
  204.     MOVEQ    #0,D2
  205.     MOVE.B    n_cmd(A6),D2        ;Get lower 4 bits of instrument
  206.     AND.B    #$F0,D2
  207.     LSR.B    #4,D2
  208.     MOVE.B    (A6),D0            ;Get higher 4 bits of instrument
  209.     AND.B    #$F0,D0
  210.     OR.B    D0,D2
  211.     TST.B    D2
  212.     BEQ.B    pt_SetRegisters        ;Instrument was zero
  213.     MOVEQ    #0,D3
  214.     LEA    pt_SampleStarts(PC),A1
  215.     MOVE    D2,D4
  216.     MOVE.B    D2,n_samplenum(A6)
  217.     SUBQ.L    #1,D2
  218.     LSL.L    #2,D2
  219.     MULU    #30,D4
  220.     MOVE.L    0(a1,D2.L),n_start(A6)
  221.     MOVE.W    0(a3,D4.L),n_length(A6)
  222.     MOVE.W    0(a3,D4.L),n_reallength(A6)
  223.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  224.     MOVE.B    3(A3,D4.L),n_volume(A6)
  225.     MOVE.W    4(A3,D4.L),D3         ;Get repeat
  226.     TST.W    D3
  227.     BEQ.B    pt_NoLoop
  228.     MOVE.L    n_start(A6),D2        ;Get start
  229.     ASL.W    #1,D3
  230.     ADD.L    D3,D2            ;Add repeat
  231.     MOVE.L    D2,n_loopstart(A6)
  232.     MOVE.L    D2,n_wavestart(A6)
  233.     MOVE.W    4(A3,D4.L),D0        ;Get repeat
  234.     ADD.W    6(A3,D4.L),D0        ;Add replen
  235.     MOVE.W    D0,n_length(A6)
  236.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  237.     BRA.B    pt_SetRegisters
  238.  
  239. pt_NoLoop
  240.     MOVE.L    n_start(A6),D2
  241.     ADD.L    D3,D2
  242.     MOVE.L    D2,n_loopstart(A6)
  243.     MOVE.L    D2,n_wavestart(A6)
  244.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  245. pt_SetRegisters
  246.     MOVE.W    (A6),D0
  247.     AND.W    #$0FFF,D0
  248.     BEQ.W    pt_CheckMoreEffects    ;If no note ->
  249.     MOVE.W    2(A6),D0
  250.     AND.W    #$0FF0,D0
  251.     CMP.W    #$0E50,D0         ;finetune?
  252.     BEQ.B    pt_DoSetFineTune
  253.     MOVE.B    2(A6),D0
  254.     AND.B    #$0F,D0
  255.     CMP.B    #3,D0            ;TonePortamento?
  256.     BEQ.B    pt_ChkTonePorta
  257.     CMP.B    #5,D0            ;TonePortamento + VolSlide?
  258.     BEQ.B    pt_ChkTonePorta
  259.     CMP.B    #9,D0            ;Sample Offset?
  260.     BNE.B    pt_SetPeriod
  261.     BSR.W    pt_CheckMoreEffects
  262.     BRA.B    pt_SetPeriod
  263.  
  264. pt_DoSetFineTune
  265.     BSR.W    pt_SetFineTune
  266.     BRA.B    pt_SetPeriod
  267.  
  268. pt_ChkTonePorta
  269.     BSR.W    pt_SetTonePorta
  270.     BRA.W    pt_CheckMoreEffects
  271.  
  272. pt_SetPeriod
  273.     MOVEM.L    D0-D1/A0-A1,-(SP)
  274.     MOVE.W    (A6),D1
  275.     AND.W    #$0FFF,D1
  276.     LEA    pt_PeriodTable(PC),A1
  277.     MOVEQ    #0,D0
  278.     MOVEQ    #$24,D7
  279. pt_ftuloop
  280.     CMP.W    0(a1,D0.W),D1
  281.     BHS.B    pt_ftufound
  282.     ADDQ.L    #2,D0
  283.     DBRA    D7,pt_ftuloop
  284. pt_ftufound
  285.     MOVEQ    #0,D1
  286.     MOVE.B    n_finetune(A6),D1
  287.     MULU    #37*2,D1
  288.     ADD.L    D1,A1
  289.     MOVE.W    0(a1,D0.W),n_period(A6)
  290.     MOVEM.L    (SP)+,D0-D1/A0-A1
  291.  
  292.     MOVE.W    2(A6),D0
  293.     AND.W    #$0FF0,D0
  294.     CMP.W    #$0ED0,D0
  295.     BEQ.W    pt_CheckMoreEffects
  296.  
  297.     MOVE.W    n_dmabit(A6),$DFF096
  298.     BTST    #2,n_wavecontrol(A6)
  299.     BNE.B    pt_vibnoc
  300.     CLR.B    n_vibratopos(A6)
  301. pt_vibnoc
  302.     BTST    #6,n_wavecontrol(A6)
  303.     BNE.B    pt_trenoc
  304.     CLR.B    n_tremolopos(A6)
  305. pt_trenoc
  306.     MOVE.W    n_length(A6),4(A5)    ;Set length
  307.     MOVE.L    n_start(A6),(A5)    ;Set start
  308.     BNE.B    pt_sdmaskp
  309.     CLR.L    n_loopstart(A6)
  310.     MOVEQ    #1,D0
  311.     MOVE.W    D0,4(A5)
  312.     MOVE.W    D0,n_replen(A6)
  313. pt_sdmaskp
  314.     MOVE.W    n_period(A6),D0
  315.     MOVE.W    D0,6(A5)        ;Set period
  316.     ST    n_trigger(A6)
  317.     MOVE.W    n_dmabit(A6),D0
  318.     OR.W    D0,pt_DMACONtemp
  319.     BRA.W    pt_CheckMoreEffects
  320.  
  321. pt_SetDMA
  322.     move.b    pt_timeout,$bfe701    ;TimerB HI
  323.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  324.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  325. pt_timerwait1
  326.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  327.     bne.s    pt_timerwait1        ;nope...
  328.     MOVE.W    pt_DMACONtemp,D0
  329.     AND.W    pt_ActiveChannels,D0    ;mask out inactive channels
  330.     OR.W    #$8000,D0
  331.     MOVE.W    D0,$DFF096
  332.     move.b    pt_timeout,$bfe701    ;TimerB HI
  333.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  334.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  335. pt_timerwait2
  336.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  337.     bne.s    pt_timerwait2        ;nope...
  338.     LEA    $DFF000,A5
  339.     LEA    pt_audchan4temp(PC),A6
  340.     MOVE.L    n_loopstart(A6),$D0(A5)
  341.     MOVE.W    n_replen(A6),$D4(A5)
  342.     LEA    pt_audchan3temp(PC),A6
  343.     MOVE.L    n_loopstart(A6),$C0(A5)
  344.     MOVE.W    n_replen(A6),$C4(A5)
  345.     LEA    pt_audchan2temp(PC),A6
  346.     MOVE.L    n_loopstart(A6),$B0(A5)
  347.     MOVE.W    n_replen(A6),$B4(A5)
  348.     LEA    pt_audchan1temp(PC),A6
  349.     MOVE.L    n_loopstart(A6),$A0(A5)
  350.     MOVE.W    n_replen(A6),$A4(A5)
  351.  
  352. pt_dskip
  353.     ADD.L    #16,pt_PatternPosition
  354.     MOVE.B    pt_PattDelayTime,D0
  355.     BEQ.B    pt_dskpc
  356.     MOVE.B    D0,pt_PattDelayTime2
  357.     CLR.B    pt_PattDelayTime
  358. pt_dskpc
  359.     TST.B    pt_PattDelayTime2
  360.     BEQ.B    pt_dskpa
  361.     SUBQ.B    #1,pt_PattDelayTime2
  362.     BEQ.B    pt_dskpa
  363.     SUB.L    #16,pt_PatternPosition
  364. pt_dskpa
  365.     TST.B    pt_PBreakFlag
  366.     BEQ.B    pt_nnpysk
  367.     SF    pt_PBreakFlag
  368.     MOVEQ    #0,D0
  369.     MOVE.B    pt_PBreakPosition(PC),D0
  370.     LSL.W    #4,D0
  371.     MOVE.L    D0,pt_PatternPosition
  372.     CLR.B    pt_PBreakPosition
  373. pt_nnpysk
  374.     CMP.L    #1024,pt_PatternPosition
  375.     BNE.B    pt_NoNewPositionYet
  376. pt_NextPosition    
  377.     MOVEQ    #0,D0
  378.     MOVE.B    pt_PBreakPosition(PC),D0
  379.     LSL.W    #4,D0
  380.     MOVE.L    D0,pt_PatternPosition
  381.     CLR.B    pt_PBreakPosition
  382.     CLR.B    pt_PosJumpAssert
  383.     ADDQ.L    #1,pt_SongPosition
  384.     AND.L    #$7F,pt_SongPosition
  385.     MOVE.L    pt_SongPosition(PC),D1
  386.     MOVE.L    pt_SongDataPtr(PC),A0
  387.     CMP.B    sd_numofpatt(A0),D1
  388.     BLO.B    pt_NoNewPositionYet
  389.     CLR.L    pt_SongPosition
  390. pt_NoNewPositionYet
  391.     TST.B    pt_PosJumpAssert
  392.     BNE.B    pt_NextPosition
  393.     MOVEM.L    (SP)+,D0-D7/A0-A6
  394.     RTS
  395.  
  396. pt_CheckEffects
  397.     BSR.B    pt_chkefx2
  398.     MOVEQ    #0,D0
  399.     MOVE.B    n_volume(A6),D0
  400.     MOVE.W    D0,8(A5)
  401.     RTS
  402.  
  403. pt_chkefx2
  404.     BSR.W    pt_UpdateFunk
  405.     MOVE.W    n_cmd(A6),D0
  406.     AND.W    #$0FFF,D0
  407.     BEQ.B    pt_Return
  408.     MOVE.B    n_cmd(A6),D0
  409.     AND.B    #$0F,D0
  410.     TST.B    D0
  411.     BEQ.B    pt_Arpeggio
  412.     CMP.B    #1,D0
  413.     BEQ.W    pt_PortaUp
  414.     CMP.B    #2,D0
  415.     BEQ.W    pt_PortaDown
  416.     CMP.B    #3,D0
  417.     BEQ.W    pt_TonePortamento
  418.     CMP.B    #4,D0
  419.     BEQ.W    pt_Vibrato
  420.     CMP.B    #5,D0
  421.     BEQ.W    pt_TonePlusVolSlide
  422.     CMP.B    #6,D0
  423.     BEQ.W    pt_VibratoPlusVolSlide
  424.     CMP.B    #$E,D0
  425.     BEQ.W    pt_ECommands
  426. pt_SetBack
  427.     MOVE.W    n_period(A6),6(A5)
  428.     CMP.B    #7,D0
  429.     BEQ.W    pt_Tremolo
  430.     CMP.B    #$A,D0
  431.     BEQ.W    pt_VolumeSlide
  432. pt_Return
  433.     RTS
  434.  
  435. pt_PerNop
  436.     MOVE.W    n_period(A6),6(A5)
  437.     RTS
  438.  
  439. pt_Arpeggio
  440.     MOVEQ    #0,D0
  441.     MOVE.L    pt_Counter(PC),D0
  442.     DIVS    #3,D0
  443.     SWAP    D0
  444.     CMP.W    #1,D0
  445.     BEQ.B    pt_Arpeggio1
  446.     CMP.W    #2,D0
  447.     BEQ.B    pt_Arpeggio2
  448. pt_Arpeggio0
  449.     MOVE.W    n_period(A6),D2
  450.     BRA.B    pt_ArpeggioSet
  451.  
  452. pt_Arpeggio1
  453.     MOVEQ    #0,D0
  454.     MOVE.B    n_cmdlo(A6),D0
  455.     LSR.B    #4,D0
  456.     BRA.B    pt_ArpeggioFind
  457.  
  458. pt_Arpeggio2
  459.     MOVEQ    #0,D0
  460.     MOVE.B    n_cmdlo(A6),D0
  461.     AND.B    #15,D0
  462. pt_ArpeggioFind
  463.     ASL.W    #1,D0
  464.     MOVEQ    #0,D1
  465.     MOVE.B    n_finetune(A6),D1
  466.     MULU    #37*2,D1
  467.     LEA    pt_PeriodTable(PC),A0
  468.     ADD.L    D1,A0
  469.     MOVEQ    #0,D1
  470.     MOVE.W    n_period(A6),D1
  471.     MOVEQ    #$24,D7
  472. pt_arploop
  473.     MOVE.W    0(a0,D0.W),D2
  474.     CMP.W    (A0),D1
  475.     BHS.B    pt_ArpeggioSet
  476.     ADDQ.L    #2,A0
  477.     DBRA    D7,pt_arploop
  478.     RTS
  479.  
  480. pt_ArpeggioSet
  481.     MOVE.W    D2,6(A5)
  482.     RTS
  483.  
  484. pt_FinePortaUp
  485.     TST.L    pt_Counter
  486.     BNE.B    pt_Return
  487.     MOVE.B    #$0F,pt_LowMask
  488. pt_PortaUp
  489.     MOVEQ    #0,D0
  490.     MOVE.B    n_cmdlo(A6),D0
  491.     AND.B    pt_LowMask,D0
  492.     MOVE.B    #$FF,pt_LowMask
  493.     SUB.W    D0,n_period(A6)
  494.     MOVE.W    n_period(A6),D0
  495.     AND.W    #$0FFF,D0
  496.     CMP.W    #$0071,D0
  497.     BPL.B    pt_PortaUskip
  498.     AND.W    #$F000,n_period(A6)
  499.     OR.W    #$0071,n_period(A6)
  500. pt_PortaUskip
  501.     MOVE.W    n_period(A6),D0
  502.     AND.W    #$0FFF,D0
  503.     MOVE.W    D0,6(A5)
  504.     RTS
  505.  
  506. pt_FinePortaDown
  507.     TST.L    pt_Counter
  508.     BNE.W    pt_Return
  509.     MOVE.B    #$0F,pt_LowMask
  510. pt_PortaDown
  511.     CLR.W    D0
  512.     MOVE.B    n_cmdlo(A6),D0
  513.     AND.B    pt_LowMask,D0
  514.     MOVE.B    #$FF,pt_LowMask
  515.     ADD.W    D0,n_period(A6)
  516.     MOVE.W    n_period(A6),D0
  517.     AND.W    #$0FFF,D0
  518.     CMP.W    #$0358,D0
  519.     BMI.B    pt_Portadskip
  520.     AND.W    #$F000,n_period(A6)
  521.     OR.W    #$0358,n_period(A6)
  522. pt_Portadskip
  523.     MOVE.W    n_period(A6),D0
  524.     AND.W    #$0FFF,D0
  525.     MOVE.W    D0,6(A5)
  526.     RTS
  527.  
  528. pt_SetTonePorta
  529.     MOVE.L    A0,-(SP)
  530.     MOVE.W    (A6),D2
  531.     AND.W    #$0FFF,D2
  532.     MOVEQ    #0,D0
  533.     MOVE.B    n_finetune(A6),D0
  534.     MULU    #37*2,D0
  535.     LEA    pt_PeriodTable(PC),A0
  536.     ADD.L    D0,A0
  537.     MOVEQ    #0,D0
  538. pt_StpLoop
  539.     CMP.W    0(a0,D0.W),D2
  540.     BHS.B    pt_StpFound
  541.     ADDQ.W    #2,D0
  542.     CMP.W    #37*2,D0
  543.     BLO.B    pt_StpLoop
  544.     MOVEQ    #35*2,D0
  545. pt_StpFound
  546.     MOVE.B    n_finetune(A6),D2
  547.     AND.B    #8,D2
  548.     BEQ.B    pt_StpGoss
  549.     TST.W    D0
  550.     BEQ.B    pt_StpGoss
  551.     SUBQ.W    #2,D0
  552. pt_StpGoss
  553.     MOVE.W    0(a0,D0.W),D2
  554.     MOVE.L    (SP)+,A0
  555.     MOVE.W    D2,n_wantedperiod(A6)
  556.     MOVE.W    n_period(A6),D0
  557.     CLR.B    n_toneportdirec(A6)
  558.     CMP.W    D0,D2
  559.     BEQ.B    pt_ClearTonePorta
  560.     BGE.W    pt_Return
  561.     MOVE.B    #1,n_toneportdirec(A6)
  562.     RTS
  563.  
  564. pt_ClearTonePorta
  565.     CLR.W    n_wantedperiod(A6)
  566.     RTS    
  567.  
  568. pt_TonePortamento
  569.     MOVE.B    n_cmdlo(A6),D0
  570.     BEQ.B    pt_TonePortNoChange
  571.     MOVE.B    D0,n_toneportspeed(A6)
  572.     CLR.B    n_cmdlo(A6)
  573. pt_TonePortNoChange
  574.     TST.W    n_wantedperiod(A6)
  575.     BEQ.W    pt_Return
  576.     MOVEQ    #0,D0
  577.     MOVE.B    n_toneportspeed(A6),D0
  578.     TST.B    n_toneportdirec(A6)
  579.     BNE.B    pt_TonePortaUp
  580. pt_TonePortaDown
  581.     ADD.W    D0,n_period(A6)
  582.     MOVE.W    n_wantedperiod(A6),D0
  583.     CMP.W    n_period(A6),D0
  584.     BGT.B    pt_TonePortaSetPer
  585.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  586.     CLR.W    n_wantedperiod(A6)
  587.     BRA.B    pt_TonePortaSetPer
  588.  
  589. pt_TonePortaUp
  590.     SUB.W    D0,n_period(A6)
  591.     MOVE.W    n_wantedperiod(A6),D0
  592.     CMP.W    n_period(A6),D0
  593.     BLT.B    pt_TonePortaSetPer
  594.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  595.     CLR.W    n_wantedperiod(A6)
  596.  
  597. pt_TonePortaSetPer
  598.     MOVE.W    n_period(A6),D2
  599.     MOVE.B    n_glissfunk(A6),D0
  600.     AND.B    #$0F,D0
  601.     BEQ.B    pt_GlissSkip
  602.     MOVEQ    #0,D0
  603.     MOVE.B    n_finetune(A6),D0
  604.     MULU    #37*2,D0
  605.     LEA    pt_PeriodTable(PC),A0
  606.     ADD.L    D0,A0
  607.     MOVEQ    #0,D0
  608. pt_GlissLoop
  609.     CMP.W    0(a0,D0.W),D2
  610.     BHS.B    pt_GlissFound
  611.     ADDQ.W    #2,D0
  612.     CMP.W    #37*2,D0
  613.     BLO.B    pt_GlissLoop
  614.     MOVEQ    #35*2,D0
  615. pt_GlissFound
  616.     MOVE.W    0(a0,D0.W),D2
  617. pt_GlissSkip
  618.     MOVE.W    D2,6(A5)         ;Set period
  619.     RTS
  620.  
  621. pt_Vibrato
  622.     MOVE.B    n_cmdlo(A6),D0
  623.     BEQ.B    pt_Vibrato2
  624.     MOVE.B    n_vibratocmd(A6),D2
  625.     AND.B    #$0F,D0
  626.     BEQ.B    pt_vibskip
  627.     AND.B    #$F0,D2
  628.     OR.B    D0,D2
  629. pt_vibskip
  630.     MOVE.B    n_cmdlo(A6),D0
  631.     AND.B    #$F0,D0
  632.     BEQ.B    pt_vibskip2
  633.     AND.B    #$0F,D2
  634.     OR.B    D0,D2
  635. pt_vibskip2
  636.     MOVE.B    D2,n_vibratocmd(A6)
  637. pt_Vibrato2
  638.     MOVE.L    A4,-(SP)
  639.     MOVE.B    n_vibratopos(A6),D0
  640.     LEA    pt_VibratoTable(PC),A4
  641.     LSR.W    #2,D0
  642.     AND.W    #$001F,D0
  643.     MOVEQ    #0,D2
  644.     MOVE.B    n_wavecontrol(A6),D2
  645.     AND.B    #$03,D2
  646.     BEQ.B    pt_vib_sine
  647.     LSL.B    #3,D0
  648.     CMP.B    #1,D2
  649.     BEQ.B    pt_vib_rampdown
  650.     MOVE.B    #255,D2
  651.     BRA.B    pt_vib_set
  652. pt_vib_rampdown
  653.     TST.B    n_vibratopos(A6)
  654.     BPL.B    pt_vib_rampdown2
  655.     MOVE.B    #255,D2
  656.     SUB.B    D0,D2
  657.     BRA.B    pt_vib_set
  658. pt_vib_rampdown2
  659.     MOVE.B    D0,D2
  660.     BRA.B    pt_vib_set
  661. pt_vib_sine
  662.     MOVE.B    0(A4,D0.W),D2
  663. pt_vib_set
  664.     MOVE.B    n_vibratocmd(A6),D0
  665.     AND.W    #15,D0
  666.     MULU    D0,D2
  667.     LSR.W    #7,D2
  668.     MOVE.W    n_period(A6),D0
  669.     TST.B    n_vibratopos(A6)
  670.     BMI.B    pt_VibratoNeg
  671.     ADD.W    D2,D0
  672.     BRA.B    pt_Vibrato3
  673. pt_VibratoNeg
  674.     SUB.W    D2,D0
  675. pt_Vibrato3
  676.     MOVE.W    D0,6(A5)
  677.     MOVE.B    n_vibratocmd(A6),D0
  678.     LSR.W    #2,D0
  679.     AND.W    #$003C,D0
  680.     ADD.B    D0,n_vibratopos(A6)
  681.     MOVE.L    (SP)+,A4
  682.     RTS
  683.  
  684. pt_TonePlusVolSlide
  685.     BSR.W    pt_TonePortNoChange
  686.     BRA.W    pt_VolumeSlide
  687.  
  688. pt_VibratoPlusVolSlide
  689.     BSR.B    pt_Vibrato2
  690.     BRA.W    pt_VolumeSlide
  691.  
  692. pt_Tremolo
  693.     MOVE.L    A4,-(SP)
  694.     MOVE.B    n_cmdlo(A6),D0
  695.     BEQ.B    pt_Tremolo2
  696.     MOVE.B    n_tremolocmd(A6),D2
  697.     AND.B    #$0F,D0
  698.     BEQ.B    pt_treskip
  699.     AND.B    #$F0,D2
  700.     OR.B    D0,D2
  701. pt_treskip
  702.     MOVE.B    n_cmdlo(A6),D0
  703.     AND.B    #$F0,D0
  704.     BEQ.B    pt_treskip2
  705.     AND.B    #$0F,D2
  706.     OR.B    D0,D2
  707. pt_treskip2
  708.     MOVE.B    D2,n_tremolocmd(A6)
  709. pt_Tremolo2
  710.     MOVE.B    n_tremolopos(A6),D0
  711.     LEA    pt_VibratoTable(PC),A4
  712.     LSR.W    #2,D0
  713.     AND.W    #$001F,D0
  714.     MOVEQ    #0,D2
  715.     MOVE.B    n_wavecontrol(A6),D2
  716.     LSR.B    #4,D2
  717.     AND.B    #$03,D2
  718.     BEQ.B    pt_tre_sine
  719.     LSL.B    #3,D0
  720.     CMP.B    #1,D2
  721.     BEQ.B    pt_tre_rampdown
  722.     MOVE.B    #255,D2
  723.     BRA.B    pt_tre_set
  724. pt_tre_rampdown
  725.     TST.B    n_vibratopos(A6)
  726.     BPL.B    pt_tre_rampdown2
  727.     MOVE.B    #255,D2
  728.     SUB.B    D0,D2
  729.     BRA.B    pt_tre_set
  730. pt_tre_rampdown2
  731.     MOVE.B    D0,D2
  732.     BRA.B    pt_tre_set
  733. pt_tre_sine
  734.     MOVE.B    0(A4,D0.W),D2
  735. pt_tre_set
  736.     MOVE.B    n_tremolocmd(A6),D0
  737.     AND.W    #15,D0
  738.     MULU    D0,D2
  739.     LSR.W    #6,D2
  740.     MOVEQ    #0,D0
  741.     MOVE.B    n_volume(A6),D0
  742.     TST.B    n_tremolopos(A6)
  743.     BMI.B    pt_TremoloNeg
  744.     ADD.W    D2,D0
  745.     BRA.B    pt_Tremolo3
  746. pt_TremoloNeg
  747.     SUB.W    D2,D0
  748. pt_Tremolo3
  749.     BPL.B    pt_TremoloSkip
  750.     CLR.W    D0
  751. pt_TremoloSkip
  752.     CMP.W    #$40,D0
  753.     BLS.B    pt_TremoloOk
  754.     MOVE.W    #$40,D0
  755. pt_TremoloOk
  756.     MOVE.W    D0,8(A5)
  757.     MOVE.B    n_tremolocmd(A6),D0
  758.     LSR.W    #2,D0
  759.     AND.W    #$003C,D0
  760.     ADD.B    D0,n_tremolopos(A6)
  761.     MOVE.L    (SP)+,A4
  762.     ADDQ.L    #4,SP
  763.     RTS
  764.  
  765. pt_SampleOffset
  766.     MOVEQ    #0,D0
  767.     MOVE.B    n_cmdlo(A6),D0
  768.     BEQ.B    pt_sononew
  769.     MOVE.B    D0,n_sampleoffset(A6)
  770. pt_sononew
  771.     MOVE.B    n_sampleoffset(A6),D0
  772.     LSL.W    #7,D0
  773.     CMP.W    n_length(A6),D0
  774.     BGE.B    pt_sofskip
  775.     SUB.W    D0,n_length(A6)
  776.     LSL.W    #1,D0
  777.     ADD.L    D0,n_start(A6)
  778.     RTS
  779. pt_sofskip
  780.     MOVE.W    #1,n_length(A6)
  781.     RTS
  782.  
  783. pt_VolumeSlide
  784.     MOVEQ    #0,D0
  785.     MOVE.B    n_cmdlo(A6),D0
  786.     LSR.B    #4,D0
  787.     TST.B    D0
  788.     BEQ.B    pt_VolSlideDown
  789. pt_VolSlideUp
  790.     ADD.B    D0,n_volume(A6)
  791.     CMP.B    #$40,n_volume(A6)
  792.     BMI.B    pt_vsuskip
  793.     MOVE.B    #$40,n_volume(A6)
  794. pt_vsuskip
  795.     MOVE.B    n_volume(A6),D0
  796.     RTS
  797.  
  798. pt_VolSlideDown
  799.     MOVEQ    #0,D0
  800.     MOVE.B    n_cmdlo(A6),D0
  801.     AND.B    #$0F,D0
  802. pt_VolSlideDown2
  803.     SUB.B    D0,n_volume(A6)
  804.     BPL.B    pt_vsdskip
  805.     CLR.B    n_volume(A6)
  806. pt_vsdskip
  807.     MOVE.B    n_volume(A6),D0
  808.     RTS
  809.  
  810. pt_PositionJump
  811.     MOVEQ    #0,D0
  812.     MOVE.B    n_cmdlo(A6),D0
  813.     SUBQ.B    #1,D0
  814.     MOVE.L    D0,pt_SongPosition
  815. pt_pj2    CLR.B    pt_PBreakPosition
  816.     ST     pt_PosJumpAssert
  817.     RTS
  818.  
  819. pt_VolumeChange
  820.     MOVEQ    #0,D0
  821.     MOVE.B    n_cmdlo(A6),D0
  822.     CMP.B    #$40,D0
  823.     BLS.B    pt_VolumeOk
  824.     MOVEQ    #$40,D0
  825. pt_VolumeOk
  826.     MOVE.B    D0,n_volume(A6)
  827.     RTS
  828.  
  829. pt_PatternBreak
  830.     MOVEQ    #0,D0
  831.     MOVE.B    n_cmdlo(A6),D0
  832.     MOVE.L    D0,D2
  833.     LSR.B    #4,D0
  834.     MULU    #10,D0
  835.     AND.B    #$0F,D2
  836.     ADD.B    D2,D0
  837.     CMP.B    #63,D0
  838.     BHI.B    pt_pj2
  839.     MOVE.B    D0,pt_PBreakPosition
  840.     ST    pt_PosJumpAssert
  841.     RTS
  842.  
  843. pt_SetSpeed
  844.     MOVE.B    3(A6),D0
  845.     AND.W    #$FF,D0
  846.     BEQ.B    pt_SpeedNull
  847. ;    CMP.W    #32,D0            ;change this for lev6/CIA users
  848. ;    BLO.B    normspd            ;it updates the countervalues (Tempo)
  849. ;    MOVE.W    D0,RealTempo        ;for the BPM timer
  850. ;    MOVEM.L    D0-D7/A0-A6,-(SP)
  851. ;    ST    UpdateTempo
  852. ;    JSR    SetTempo
  853. ;    MOVEM.L    (SP)+,D0-D7/A0-A6
  854. ;    RTS
  855. pt_normspd
  856.     CLR.L    pt_Counter
  857.     MOVE.W    D0,pt_CurrSpeed+2
  858.     RTS
  859. pt_SpeedNull
  860.     RTS
  861.  
  862. pt_CheckMoreEffects
  863.     MOVE.B    2(A6),D0
  864.     AND.B    #$0F,D0
  865.     CMP.B    #$9,D0
  866.     BEQ.W    pt_SampleOffset
  867.     CMP.B    #$B,D0
  868.     BEQ.W    pt_PositionJump
  869.     CMP.B    #$D,D0
  870.     BEQ.B    pt_PatternBreak
  871.     CMP.B    #$E,D0
  872.     BEQ.B    pt_ECommands
  873.     CMP.B    #$F,D0
  874.     BEQ.B    pt_SetSpeed
  875.     CMP.B    #$C,D0
  876.     BEQ.W    pt_VolumeChange
  877.     BRA.W    pt_PerNop
  878.  
  879. pt_ECommands
  880.     MOVE.B    n_cmdlo(A6),D0
  881.     AND.B    #$F0,D0
  882.     LSR.B    #4,D0
  883.     BEQ.B    pt_FilterOnOff
  884.     CMP.B    #1,D0
  885.     BEQ.W    pt_FinePortaUp
  886.     CMP.B    #2,D0
  887.     BEQ.W    pt_FinePortaDown
  888.     CMP.B    #3,D0
  889.     BEQ.B    pt_SetGlissControl
  890.     CMP.B    #4,D0
  891.     BEQ.W    pt_SetVibratoControl
  892.     CMP.B    #5,D0
  893.     BEQ.W    pt_SetFineTune
  894.     CMP.B    #6,D0
  895.     BEQ.W    pt_JumpLoop
  896.     CMP.B    #7,D0
  897.     BEQ.W    pt_SetTremoloControl
  898.     CMP.B    #8,D0
  899.     BEQ.W    pt_KarplusStrong
  900.     CMP.B    #$E,D0
  901.     BEQ.W    pt_PatternDelay
  902.     CMP.B    #9,D0
  903.     BEQ.W    pt_RetrigNote
  904.     CMP.B    #$A,D0
  905.     BEQ.W    pt_VolumeFineUp
  906.     CMP.B    #$B,D0
  907.     BEQ.W    pt_VolumeFineDown
  908.     CMP.B    #$C,D0
  909.     BEQ.W    pt_NoteCut
  910.     CMP.B    #$D,D0
  911.     BEQ.W    pt_NoteDelay
  912.     CMP.B    #$F,D0
  913.     BEQ.W    pt_FunkIt
  914.     RTS
  915.  
  916. pt_FilterOnOff
  917.     MOVE.B    n_cmdlo(A6),D0
  918.     AND.B    #1,D0
  919.     ASL.B    #1,D0
  920.     AND.B    #$FD,$BFE001
  921.     OR.B    D0,$BFE001
  922.     RTS    
  923.  
  924. pt_SetGlissControl
  925.     MOVE.B    n_cmdlo(A6),D0
  926.     AND.B    #$0F,D0
  927.     AND.B    #$F0,n_glissfunk(A6)
  928.     OR.B    D0,n_glissfunk(A6)
  929.     RTS
  930.  
  931. pt_SetVibratoControl
  932.     MOVE.B    n_cmdlo(A6),D0
  933.     AND.B    #$0F,D0
  934.     AND.B    #$F0,n_wavecontrol(A6)
  935.     OR.B    D0,n_wavecontrol(A6)
  936.     RTS
  937.  
  938. pt_SetFineTune
  939.     MOVE.B    n_cmdlo(A6),D0
  940.     AND.B    #$0F,D0
  941.     MOVE.B    D0,n_finetune(A6)
  942.     RTS
  943.  
  944. pt_JumpLoop
  945.     TST.L    pt_Counter
  946.     BNE.W    pt_Return
  947.     MOVE.B    n_cmdlo(A6),D0
  948.     AND.B    #$0F,D0
  949.     BEQ.B    pt_SetLoop
  950.     TST.B    n_loopcount(A6)
  951.     BEQ.B    pt_jumpcnt
  952.     SUB.B    #1,n_loopcount(A6)
  953.     BEQ.W    pt_Return
  954. pt_jmploop
  955.     MOVE.B    n_pattpos(A6),pt_PBreakPosition
  956.     ST    pt_PBreakFlag
  957.     RTS
  958.  
  959. pt_jumpcnt
  960.     MOVE.B    D0,n_loopcount(A6)
  961.     BRA.B    pt_jmploop
  962.  
  963. pt_SetLoop
  964.     MOVE.L    pt_PatternPosition,D0
  965.     LSR.L    #4,D0
  966.     AND.B    #63,D0
  967.     MOVE.B    D0,n_pattpos(A6)
  968.     RTS
  969.  
  970. pt_SetTremoloControl
  971.     MOVE.B    n_cmdlo(A6),D0
  972.     AND.B    #$0F,D0
  973.     LSL.B    #4,D0
  974.     AND.B    #$0F,n_wavecontrol(A6)
  975.     OR.B    D0,n_wavecontrol(A6)
  976.     RTS
  977.  
  978. pt_KarplusStrong
  979.     MOVEM.L    D1-D2/A0-A1,-(SP)
  980.     MOVE.L    n_loopstart(A6),A0
  981.     MOVE.L    A0,A1
  982.     MOVE.W    n_replen(A6),D0
  983.     ADD.W    D0,D0
  984.     SUBQ.W    #2,D0
  985. pt_karplop
  986.     MOVE.B    (A0),D1
  987.     EXT.W    D1
  988.     MOVE.B    1(A0),D2
  989.     EXT.W    D2
  990.     ADD.W    D1,D2
  991.     ASR.W    #1,D2
  992.     MOVE.B    D2,(A0)+
  993.     DBRA    D0,pt_karplop
  994.     MOVE.B    (A0),D1
  995.     EXT.W    D1
  996.     MOVE.B    (A1),D2
  997.     EXT.W    D2
  998.     ADD.W    D1,D2
  999.     ASR.W    #1,D2
  1000.     MOVE.B    D2,(A0)
  1001.     MOVEM.L    (SP)+,D1-D2/A0-A1
  1002.     RTS
  1003.  
  1004. pt_RetrigNote
  1005.     MOVE.L    D1,-(SP)
  1006.     MOVEQ    #0,D0
  1007.     MOVE.B    n_cmdlo(A6),D0
  1008.     AND.B    #$0F,D0
  1009.     BEQ.W    pt_rtnend
  1010.     MOVE.L    pt_Counter,D1
  1011.     BNE.B    pt_rtnskp
  1012.     MOVE.W    n_note(A6),D1
  1013.     AND.W    #$0FFF,D1
  1014.     BNE.W    pt_rtnend
  1015.     MOVE.L    pt_Counter,D1
  1016. pt_rtnskp
  1017.     DIVU    D0,D1
  1018.     SWAP    D1
  1019.     TST.W    D1
  1020.     BNE.W    pt_rtnend
  1021. pt_DoRetrg
  1022.     MOVE.W    n_dmabit(A6),$DFF096    ;Audio DMA off
  1023.     MOVE.L    n_start(A6),(A5)    ;Set sampledata pointer
  1024.     MOVE.W    n_length(A6),4(A5)    ;Set length
  1025.     MOVE.W    n_period(A6),6(A5)
  1026.     MOVEQ    #0,D0
  1027.     MOVE.B    n_volume(A6),D0
  1028.  
  1029.     move.b    pt_timeout,$bfe701    ;TimerB HI
  1030.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  1031.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  1032. pt_timerwait3
  1033.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  1034.     bne.s    pt_timerwait3        ;nope...
  1035.  
  1036.     MOVE.W    n_dmabit(A6),D0
  1037.     BSET    #15,D0
  1038.     MOVE.W    D0,$DFF096
  1039.  
  1040.     move.b    pt_timeout,$bfe701    ;TimerB HI
  1041.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  1042.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  1043. pt_timerwait4
  1044.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  1045.     bne.s    pt_timerwait4        ;nope...
  1046.  
  1047.     MOVE.L    n_loopstart(A6),(A5)
  1048.     MOVE.L    n_replen(A6),4(A5)
  1049. pt_rtnend
  1050.     MOVE.L    (SP)+,D1
  1051.     RTS
  1052.  
  1053. pt_VolumeFineUp
  1054.     TST.L    pt_Counter
  1055.     BNE.W    pt_Return
  1056.     MOVEQ    #0,D0
  1057.     MOVE.B    n_cmdlo(A6),D0
  1058.     AND.B    #$F,D0
  1059.     BRA.W    pt_VolSlideUp
  1060.  
  1061. pt_VolumeFineDown
  1062.     TST.L    pt_Counter
  1063.     BNE.W    pt_Return
  1064.     MOVEQ    #0,D0
  1065.     MOVE.B    n_cmdlo(A6),D0
  1066.     AND.B    #$0F,D0
  1067.     BRA.W    pt_VolSlideDown2
  1068.  
  1069. pt_NoteCut
  1070.     MOVEQ    #0,D0
  1071.     MOVE.B    n_cmdlo(A6),D0
  1072.     AND.B    #$0F,D0
  1073.     CMP.L    pt_Counter,D0
  1074.     BNE.W    pt_Return
  1075.     CLR.B    n_volume(A6)
  1076.     RTS
  1077.  
  1078. pt_NoteDelay
  1079.     MOVEQ    #0,D0
  1080.     MOVE.B    n_cmdlo(A6),D0
  1081.     AND.B    #$0F,D0
  1082.     CMP.L    pt_Counter,D0
  1083.     BNE.W    pt_Return
  1084.     MOVE.W    (A6),D0
  1085.     AND.W    #$0FFF,D0
  1086.     BEQ.W    pt_Return
  1087.     MOVE.L    D1,-(SP)
  1088.     BRA.W    pt_DoRetrg
  1089.  
  1090. pt_PatternDelay
  1091.     TST.L    pt_Counter
  1092.     BNE.W    pt_Return
  1093.     MOVEQ    #0,D0
  1094.     MOVE.B    n_cmdlo(A6),D0
  1095.     AND.B    #$0F,D0
  1096.     TST.B    pt_PattDelayTime2
  1097.     BNE.W    pt_Return
  1098.     ADDQ.B    #1,D0
  1099.     MOVE.B    D0,pt_PattDelayTime
  1100.     RTS
  1101.  
  1102. pt_FunkIt
  1103.     TST.L    pt_Counter
  1104.     BNE.W    pt_Return
  1105.     MOVE.B    n_cmdlo(A6),D0
  1106.     AND.B    #$0F,D0
  1107.     LSL.B    #4,D0
  1108.     AND.B    #$0F,n_glissfunk(A6)
  1109.     OR.B    D0,n_glissfunk(A6)
  1110.     TST.B    D0
  1111.     BEQ.W    pt_Return
  1112. pt_UpdateFunk
  1113.     MOVEM.L    A0/D1,-(SP)
  1114.     MOVEQ    #0,D0
  1115.     MOVE.B    n_glissfunk(A6),D0
  1116.     LSR.B    #4,D0
  1117.     BEQ.B    pt_funkend
  1118.     LEA    pt_FunkTable(PC),A0
  1119.     MOVE.B    0(a0,D0.W),D0
  1120.     ADD.B    D0,n_funkoffset(A6)
  1121.     BTST    #7,n_funkoffset(A6)
  1122.     BEQ.B    pt_funkend
  1123.     CLR.B    n_funkoffset(A6)
  1124.     MOVE.L    n_loopstart(A6),D0
  1125.     MOVEQ    #0,D1
  1126.     MOVE.W    n_replen(A6),D1
  1127.     ADD.L    D1,D0
  1128.     ADD.L    D1,D0
  1129.     MOVE.L    n_wavestart(A6),A0
  1130.     ADDQ.L    #1,A0
  1131.     CMP.L    D0,A0
  1132.     BLO.B    pt_funkok
  1133.     MOVE.L    n_loopstart(A6),A0
  1134. pt_funkok
  1135.     MOVE.L    A0,n_wavestart(A6)
  1136.     MOVEQ    #-1,D0
  1137.     SUB.B    (A0),D0
  1138.     MOVE.B    D0,(A0)
  1139. pt_funkend
  1140.     MOVEM.L    (SP)+,A0/D1
  1141.     RTS
  1142.  
  1143. pt_FunkTable
  1144.     dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1145.  
  1146. pt_VibratoTable    
  1147.     dc.b 0,24,49,74,97,120,141,161
  1148.     dc.b 180,197,212,224,235,244,250,253
  1149.     dc.b 255,253,250,244,235,224,212,197
  1150.     dc.b 180,161,141,120,97,74,49,24
  1151.  
  1152. pt_PeriodTable
  1153. ; -> Tuning 0
  1154.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1155.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1156.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113,0
  1157. ; -> Tuning 1
  1158.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1159.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1160.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113,0
  1161. ; -> Tuning 2
  1162.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1163.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1164.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112,0
  1165. ; -> Tuning 3
  1166.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1167.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1168.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111,0
  1169. ; -> Tuning 4
  1170.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1171.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1172.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110,0
  1173. ; -> Tuning 5
  1174.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1175.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1176.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109,0
  1177. ; -> Tuning 6
  1178.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1179.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1180.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109,0
  1181. ; -> Tuning 7
  1182.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1183.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1184.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108,0
  1185. ; -> Tuning -8
  1186.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1187.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1188.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120,0
  1189. ; -> Tuning -7
  1190.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1191.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1192.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119,0
  1193. ; -> Tuning -6
  1194.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1195.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1196.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118,0
  1197. ; -> Tuning -5
  1198.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1199.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1200.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118,0
  1201. ; -> Tuning -4
  1202.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1203.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1204.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117,0
  1205. ; -> Tuning -3
  1206.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1207.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1208.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116,0
  1209. ; -> Tuning -2
  1210.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1211.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1212.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115,0
  1213. ; -> Tuning -1
  1214.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1215.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1216.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114,0
  1217.  
  1218. pt_audchan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1219. pt_audchan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1220. pt_audchan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1221. pt_audchan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1222.  
  1223. pt_SampleStarts    dcb.l    31,0
  1224.  
  1225. pt_timeout    dc.w    330        ;CIA-B timeout-value
  1226. pt_Counter    dc.l    0
  1227. pt_CurrSpeed    dc.l    6
  1228. pt_PattPos    dc.w    0
  1229. pt_DMACONtemp    dc.w    0
  1230. pt_ActiveChannels
  1231.         dc.w    %00001111
  1232. pt_PatternPtr    dc.l    0
  1233. pt_PatternPosition
  1234.         dc.l    0
  1235. pt_SongPosition    dc.l    0    
  1236. pt_SongDataPtr    dc.l    0
  1237. pt_MetroSpeed    dc.b    0
  1238. pt_MetroChannel    dc.b    0
  1239. pt_Speed    dc.b    6
  1240. pt_SongPos    dc.b    0
  1241. pt_PBreakPosition
  1242.         dc.b    0
  1243. pt_PosJumpAssert
  1244.         dc.b    0
  1245. pt_PBreakFlag    dc.b    0
  1246. pt_LowMask    dc.b    0
  1247. pt_PattDelayTime
  1248.         dc.b    0
  1249. pt_PattDelayTime2
  1250.         dc.b    0
  1251.         even
  1252.  
  1253.